// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_TORQUE_LS_MESSAGE_MACROS_H_
#define V8_TORQUE_LS_MESSAGE_MACROS_H_

namespace v8 {
namespace internal {
    namespace torque {
        namespace ls {

#define JSON_STRING_ACCESSORS(name)                    \
    inline const std::string& name() const             \
    {                                                  \
        return object().at(#name).ToString();          \
    }                                                  \
    inline void set_##name(const std::string& str)     \
    {                                                  \
        object()[#name] = JsonValue::From(str);        \
    }                                                  \
    inline bool has_##name() const                     \
    {                                                  \
        return object().find(#name) != object().end(); \
    }

#define JSON_BOOL_ACCESSORS(name)                                    \
    inline bool name() const { return object().at(#name).ToBool(); } \
    inline void set_##name(bool b) { object()[#name] = JsonValue::From(b); }

#define JSON_INT_ACCESSORS(name)                                      \
    inline int name() const { return object().at(#name).ToNumber(); } \
    inline void set_##name(int n)                                     \
    {                                                                 \
        object()[#name] = JsonValue::From(static_cast<double>(n));    \
    }

#define JSON_OBJECT_ACCESSORS(type, name) \
    inline type name() { return GetObject<type>(#name); }

#define JSON_DYNAMIC_OBJECT_ACCESSORS(name) \
    template <class T>                      \
    inline T name()                         \
    {                                       \
        return GetObject<T>(#name);         \
    }

#define JSON_ARRAY_OBJECT_ACCESSORS(type, name)                                 \
    inline type add_##name()                                                    \
    {                                                                           \
        JsonObject& new_element = AddObjectElementToArrayProperty(#name);       \
        return type(new_element);                                               \
    }                                                                           \
    inline std::size_t name##_size() { return GetArrayProperty(#name).size(); } \
    inline type name(size_t idx)                                                \
    {                                                                           \
        CHECK(idx < name##_size());                                             \
        return type(GetArrayProperty(#name)[idx].ToObject());                   \
    }

        } // namespace ls
    } // namespace torque
} // namespace internal
} // namespace v8

#endif // V8_TORQUE_LS_MESSAGE_MACROS_H_
